<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7561090</id><updated>2012-02-16T23:11:17.877+01:00</updated><category term='Stolperstein'/><category term='Opinion'/><category term='General'/><category term='Allgemein'/><category term='Meinung'/><category term='HowTo'/><category term='Review'/><title type='text'>Java Blog</title><subtitle type='html'>Since I'm very lazy in sharing my thoughts, this blog may contain very few posts - so please be patient! :-)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7561090.post-6641416707716214199</id><published>2009-06-05T08:06:00.009+02:00</published><updated>2009-10-15T22:34:46.114+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HowTo'/><title type='text'>Hibernate PreparedStatement Parameter Logging</title><content type='html'>Immer wieder ein Problem: wie überrede ich Hibernate, die Parameter auszugeben, die in die PreparedStatements eingesetzt werden?&lt;br /&gt;&lt;br /&gt;Hibernate loggt mit log4j - also muss eigentlich nur ein entsprechender Log-Level gesetzt werden und man sieht die Log-Ausgaben.&lt;br /&gt;&lt;br /&gt;Weit gefehlt, wenn man vermutet, dass folgendes Statement in der log4j.properties ausreicht:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;logger.org.hibernate=DEBUG&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Diese Einstellung loggt zwar ziemlich viel von Hibernate (u.a. die PreparedStatements, die Hibernate ausführt) und macht das System dann ziemlich langsam :o) - gibt aber nicht die gewünschten PreparedStatement-Parameter aus.&lt;br /&gt;In vielen Foren weit verbreitet ist folgender Hinweis:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;log4j.logger.org.hibernate.SQL=DEBUG&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Diese Einstellung gibt ausschließlich die PreparedStatements aus und erspart somit den Rest des umfangreichen Hibernate-Loggings. Die Parameter für das PreparedStatement fehlen aber trotzdem.&lt;br /&gt;&lt;br /&gt;Gestern ging ich dann ziemlich lange auf die Suche und fand dann irgenwann in einem Foren-Eintrag folgenden Hinweis:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;log4j.logger.org.hibernate.type=TRACE&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Wichtig ist hierbei wirklich der Hinweis auf &lt;tt&gt;TRACE&lt;/tt&gt;, weil selbst in &lt;tt&gt;DEBUG&lt;/tt&gt; nichts zu sehen ist...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;log4j.logger.org.hibernate.SQL=DEBUG&lt;br /&gt;log4j.logger.org.hibernate.type=TRACE&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Beide Einstellungen zusammen ermöglichen dann ein detailliertes Nachverfolgen der ausgeführten SQL-Statements:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;DEBUG - {SQL} - select persistent0_.ID as ID8_, persistent0_.NAME as NAME8_, persistent0_.VERSION as VERSION8_, persistent0_.BUNDLE_COMMENT as BUNDLE4_8_, persistent0_.BUNDLE_DESCRIPTION as BUNDLE5_8_, persistent0_.TYPE as TYPE8_, persistent0_.CONTENT as CONTENT8_, persistent0_.VALID_FROM as VALID8_8_, persistent0_.VALID_TO as VALID9_8_, persistent0_.INSERTED_BY as INSERTED10_8_, persistent0_.INSERTED_AT as INSERTED11_8_, persistent0_.UPDATED_BY as UPDATED12_8_, persistent0_.UPDATED_AT as UPDATED13_8_ from rzanner.BRM_PERSISTENT_BUNDLE persistent0_ where persistent0_.NAME=? and persistent0_.VERSION=?&lt;br /&gt;TRACE - {StringType} - binding 'blbb.samples.config' to parameter: 1&lt;br /&gt;TRACE - {StringType} - binding '1.3.0.0-5-01-0-SNAPSHOT' to parameter: 2&lt;br /&gt;TRACE - {LongType} - returning '112817' as column: ID8_&lt;br /&gt;TRACE - {StringType} - returning 'blbb.samples.config' as column: NAME8_&lt;br /&gt;TRACE - {StringType} - returning '1.3.0.0-5-01-0-SNAPSHOT' as column: VERSION8_&lt;br /&gt;TRACE - {DateType} - returning '04 Juni 2009' as column: VALID8_8_&lt;br /&gt;TRACE - {DateType} - returning null as column: VALID9_8_&lt;br /&gt;TRACE - {StringType} - returning 'test:rzanner' as column: INSERTED10_8_&lt;br /&gt;TRACE - {TimestampType} - returning '2009-06-04 16:36:08' as column: INSERTED11_8_&lt;br /&gt;TRACE - {StringType} - returning null as column: UPDATED12_8_&lt;br /&gt;TRACE - {TimestampType} - returning null as column: UPDATED13_8_&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-6641416707716214199?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/6641416707716214199/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=6641416707716214199' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/6641416707716214199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/6641416707716214199'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2009/06/hibernate-preparedstatement-parameter.html' title='Hibernate PreparedStatement Parameter Logging'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-8503372439102650819</id><published>2008-07-21T15:23:00.002+02:00</published><updated>2008-07-21T15:32:54.885+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stolperstein'/><category scheme='http://www.blogger.com/atom/ns#' term='HowTo'/><title type='text'>Maven 2 "POM Inheritance" - Revisited</title><content type='html'>Ich habe die Lösung! Ein Kollege hat mich auf die Idee gebracht, doch nicht den How-Tos der ganzen Maven2-Büchern zu folgen :o) - also &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; und &lt;code&gt;&amp;lt;groupId&amp;gt;&lt;/code&gt; aus dem Parent-POM in den Kind-POMs wieder zu verwenden.&lt;br /&gt;&lt;br /&gt;Statt dessen trenne ich beide Versionierungen und definiere die Version des Parent-POM als konstant (z. B. "1") und hinterlege dort die eigentlichen Project-Artifact-Properties:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;  &amp;lt;groupId&amp;gt;test.group&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;parent&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;properties&amp;gt;&lt;br /&gt;    &amp;lt;project.artifact.groupId&amp;gt;test.group&amp;lt;/project.artifact.groupId&amp;gt;&lt;br /&gt;    &amp;lt;project.artifact.version&amp;gt;1.0.0.2&amp;lt;/project.artifact.version&amp;gt;&lt;br /&gt;  &amp;lt;/properties&amp;gt;&lt;br /&gt;    ...&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;In meinen Kind-POMs referenziere ich dann das Parent-POM mit dem &lt;code&gt;&amp;lt;parent&amp;gt;&lt;/code&gt;-Tag und re-definiere aber &lt;code&gt;&amp;lt;groupId&amp;gt;&lt;/code&gt; und &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt; mit den im Parent-POM definierten Properties:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;  &amp;lt;parent&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;test.group&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;parent&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/parent&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;groupId&amp;gt;${project.artifact.groupId}&amp;lt;/groupId&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;child1&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  &amp;lt;version&amp;gt;${project.artifact.version}&amp;lt;/version&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Dadurch habe ich zwar unterschiedliche Versionen des Parent-POM und des eigentlichen Projekts - muss aber trotzdem die Versionsnummer für ein neues Release meines Projekts nur an einer Stelle ändern - die Properties im Parent-POM. &lt;br /&gt;&lt;br /&gt;Genau so, wie ich es haben wollte! Nur ein wenig anders... :o)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-8503372439102650819?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java_rzanner.blogspot.com/2008/07/maven-2-pom-inheritance.html' title='Maven 2 &quot;POM Inheritance&quot; - Revisited'/><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/8503372439102650819/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=8503372439102650819' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/8503372439102650819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/8503372439102650819'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2008/07/maven-2-pom-inheritance-revisited.html' title='Maven 2 &quot;POM Inheritance&quot; - Revisited'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-8920482002826361596</id><published>2008-07-18T23:25:00.000+02:00</published><updated>2008-07-18T23:26:32.574+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Meinung'/><category scheme='http://www.blogger.com/atom/ns#' term='Opinion'/><title type='text'>Maven 2 "POM Inheritance"</title><content type='html'>Ich beschäftige mich gerade mit Maven 2. In meiner Firma verwenden wir ein Maven 1 Buildsystem, das auch das Multiproject-Plug-In verwendet.&lt;br /&gt;&lt;br /&gt;Die Projektstruktur sieht in etwa so aus:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt; ROOT/&lt;br /&gt;   project/&lt;br /&gt;     module-1/&lt;br /&gt;       project.properties&lt;br /&gt;       project.xml           - &amp;lt;extend&amp;gt;../commons/project.xml&amp;lt;/extend&amp;gt;&lt;br /&gt;     module-2/&lt;br /&gt;       project.properties&lt;br /&gt;       project.xml           - &amp;lt;extend&amp;gt;../commons/project.xml&amp;lt;/extend&amp;gt;&lt;br /&gt;     commons/&lt;br /&gt;       project.properties    - definiert alle Dependency-Versionsnummern, aber auch&lt;br /&gt;                               Version und Group-ID des gesamten Projekts&lt;br /&gt;       project.xml           - definiert gemeinsame Dependencies&lt;br /&gt;     project.properties      - Multi-Project-Konfigurations-Properties&lt;br /&gt;     project.xml             - &amp;lt;extend&amp;gt;commons/project.xml&amp;lt;/extend&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Das &lt;code&gt;commons&lt;/code&gt;-Projekt enthält das "Parent-POM", welches sowohl die gemeinsamen Dependencies mit ihren Versionsnummern (ausgelagert in &lt;code&gt;project.properties&lt;/code&gt;) als auch die Versionsnummer und Group-ID des gesamten Projekts - also die Vorgabe für alle Module - enthält.&lt;br /&gt;&lt;br /&gt;Die Module selbst enthalten weder &lt;code&gt;&amp;lt;groupId&amp;gt;&lt;/code&gt; noch &lt;code&gt;&amp;lt;version&amp;gt;&lt;/code&gt;-Tags, sondern "erben" diese von dem &lt;code&gt;commons/project.xml&lt;/code&gt; mittels &lt;code&gt;&amp;lt;extend&amp;gt;&lt;/code&gt;-Tag ("POM Inheritance").&lt;br /&gt;&lt;br /&gt;Damit werden Versionsnummer und Group-ID zentral über das &lt;code&gt;commons&lt;/code&gt;-Projekt gesteuert und es muss bei einem neuen Release nur an dieser einen Stelle editiert werden.&lt;br /&gt;&lt;br /&gt;Über die übergeordnete &lt;code&gt;project.xml&lt;/code&gt;-Datei ist mittels &lt;code&gt;multiproject-plugin&lt;/code&gt; ein Build des gesamten Projekt - also aller Module - möglich. In &lt;code&gt;project.properties&lt;/code&gt; wird dabei mit Include- und Exclude-Patterns definiert, welche &lt;code&gt;project.xml&lt;/code&gt;-Dateien der untergeordneten Module in den Mutiproject-Build einfließen sollen ("POM Aggregation"). &lt;br /&gt;Dabei wird z. B. das &lt;code&gt;commons/project.xml&lt;/code&gt; exkludiert, da es ja nur das "Parent-POM" für alle anderen Module ist.&lt;br /&gt;&lt;br /&gt;Mit Maven 2 ist alles ein wenig anders. &lt;br /&gt;&lt;br /&gt;Es wird allerdings ebenfalls unterschieden in "POM Inheritance" und "POM Aggregation".&lt;br /&gt;&lt;br /&gt;"POM Aggregation" ist einfach: das Top-Level-Projekt enthält in einer &lt;code&gt;&amp;lt;modules&amp;gt;&lt;/code&gt;-Sektion alle Module, die gleichzeitig gebaut werden sollen - also voneinander abhängig sind.&lt;br /&gt;Das war mit Maven 1 nur über ein zusätzliches Plug-In - &lt;code&gt;maven-multiproject-plugin&lt;/code&gt; - möglich, während "POM Aggregation" bei Maven 2 nun integraler Bestandteil ist.&lt;br /&gt;&lt;br /&gt;Mit "POM Inheritance", wie sie in Maven 2 implementiert ist, habe ich aber so meine Probleme.&lt;br /&gt;&lt;br /&gt;Das "Parent POM" - in Maven 1 mittels &lt;code&gt;&amp;lt;extend&amp;gt;&lt;/code&gt; als bloße Datei-Ressource definiert - wird nun über alle drei Projekt-Koordinaten referenziert: Group-ID, Artifact-ID und Version. Dafür darf dann in dem Kind-POM die Group-ID und die Version "fehlen" (siehe Beispiel).&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;project&amp;gt;&lt;br /&gt;  &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;&lt;br /&gt;  &amp;lt;parent&amp;gt;&lt;br /&gt;    &amp;lt;groupId&amp;gt;eu.zanner.test&amp;lt;/groupId&amp;gt;&lt;br /&gt;    &amp;lt;artifactId&amp;gt;test&amp;lt;/artifactId&amp;gt;&lt;br /&gt;    &amp;lt;version&amp;gt;1.0&amp;lt;/version&amp;gt;&lt;br /&gt;  &amp;lt;/parent&amp;gt;&lt;br /&gt;  &amp;lt;artifactId&amp;gt;test-module&amp;lt;/artifactId&amp;gt;&lt;br /&gt;  ...&lt;br /&gt;&amp;lt;/project&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;"Fehlen" tun die Angaben aber nicht wirklich: durch die Angabe in dem &lt;code&gt;&amp;lt;parent&amp;gt;&lt;/code&gt;-Tag habe ich nun in &lt;bold&gt;jedem&lt;/bold&gt; Modul-Projekt die Versionsnummer des Parent-POMs - und damit des gesamten Projekts - zu stehen und muss bei einem neuen Release alle Module-POMs anpassen.&lt;br /&gt;&lt;br /&gt;Wo ist denn da die Wiederverwendung? Ich brauche zwar die Versionsnummer nicht im Modul-POM anzugeben, aber dafür die des Parent-POM, die dann vom Modul-POM wieder geerbt wird? Häh? Irgendwie fehlt mir hier ein Stück Verständnis. &lt;br /&gt;&lt;br /&gt;Aber es ist schon spät und außerdem Wochenende - ich gehe lieber ins Bett :o) ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-8920482002826361596?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/8920482002826361596/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=8920482002826361596' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/8920482002826361596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/8920482002826361596'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2008/07/maven-2-pom-inheritance.html' title='Maven 2 &quot;POM Inheritance&quot;'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-1616343846871925169</id><published>2008-04-15T08:32:00.004+02:00</published><updated>2008-07-18T23:25:45.538+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stolperstein'/><category scheme='http://www.blogger.com/atom/ns#' term='HowTo'/><title type='text'>Wie bestimme ich das JAR einer Java-Klasse?</title><content type='html'>Vor kurzem hatte ich die Notwendigkeit, zur Laufzeit den Pfad zum JAR einer geladenen Java-Klasse zu erfahren und musste erfahren, dass es in Java hier erstaunlicherweise keinen Standardweg gibt. Na gut - Java ist bnun nicht die dynamischste Sprache, aber eine solche Funktionalität hätte ich schon erwartet - schließlich muss die JVM buzw. der ClassLoader ja auch wissen, woher er physisch seine Klassen holt bzw. geholt hat. &lt;br /&gt;&lt;br /&gt;Als erstes bin ich auf die "ProtectionDomain - CodeSource"-Strategie gestoßen - in einem Artikel von Roedy Green's "Java Glossary" mit einem &lt;a href="http://mindprod.com/jgloss/whereclasses.html" target="_blank"&gt;Code-Beispiel&lt;/a&gt; hinterlegt.&lt;br /&gt;&lt;br /&gt;Für die meisten Fälle scheint das auch zu funktionieren, obwohl es nun überhaupt nichts mit dem der Klasse zugrunde liegenden JAR zu tun hat, sondern offenbar eher ein Standardverhalten der JVM ausnutzt.&lt;br /&gt;&lt;br /&gt;Unglücklicherweise funktioniert das beschriebene Verfahren auch nicht immer. Problematisch wird es nämlich genau dann, wenn eine Bibliothek "Schweinereien" mit dem ClassLoader bzw. dem Security-Mechanismus von Java macht.&lt;br /&gt;Maven 1.1 scheint so ein Fall zu sein. Beim Laufenlassen der JUnit-Tests eines Maven-1.1-Projekts nämlich zeigten alle CodeSource-Referenzen immer auf das erste JAR im MAVEN_HOME/lib-Verzeichnis: ant-1.6.5.jar.&lt;br /&gt;&lt;br /&gt;Nach weiterer intensiver Forschung stieß ein Kollege von mir auf eine weitere - eigentlich viel näher liegende - Lösung für das Problem "JAR zu einer Klasse".&lt;br /&gt;Im Blog von Nirav Thaker steht eine &lt;a href="http://blog.nirav.name/2008/03/how-to-find-which-jar-file-contains.html" target="_blank"&gt;Lösung&lt;/a&gt; beschrieben, die mit Standard-Java-Mitteln arbeitet und eine JarURLConnection benutzt, um den Pfad zu dem JAR einer Klasse bestimmt. Für die Eiligen hier schnell der Quellcode:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;public static URL getJarURL(Class clazz) {&lt;br /&gt;    String classResource = "/" + clazz.getPackage().getName().replace('.', '/') &lt;br /&gt;                               + "/" + clazz.getSimpleName() + ".class";&lt;br /&gt;    URL clsUrl = clazz.getResource(classResource);&lt;br /&gt;    if (clsUrl != null) {&lt;br /&gt;        try {&lt;br /&gt;            URLConnection conn = clsUrl.openConnection();&lt;br /&gt;            if (conn instanceof JarURLConnection) {&lt;br /&gt;                JarURLConnection connection = (JarURLConnection) conn;&lt;br /&gt;                return connection.getJarFileURL();&lt;br /&gt;            }&lt;br /&gt;        } catch (IOException e) {&lt;br /&gt;            throw new RuntimeException(e);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return null;&lt;br /&gt;} &lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;Im Gegensatz zu der bei Nirav veröffentlichten Version funktioniert diese Methode hier auch bei Klassen, die nicht im Default-Package liegen :o)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-1616343846871925169?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/1616343846871925169/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=1616343846871925169' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/1616343846871925169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/1616343846871925169'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2008/04/wie-bestimme-ich-das-jar-einer-java.html' title='Wie bestimme ich das JAR einer Java-Klasse?'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-8348836944840626318</id><published>2007-06-15T08:14:00.000+02:00</published><updated>2007-06-15T12:23:00.795+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Meinung'/><title type='text'>WidgetServer</title><content type='html'>&lt;span style="font-size:180%;"&gt;Anwendungsentwicklung der nächsten Generation&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Während eines früheren Projekts hatte ich bereits Kontakt mit dem WidgetServer. Er umfasst hauptsächlich ein OpenSource Framework für die Anwendungsentwicklung in Java.&lt;br /&gt;&lt;br /&gt;Ich habe den letzten Satz absichtlich so neutral wie möglich formuliert, da der WidgetServer eben KEIN übliches Framework für die Entwicklung von Webanwendungen ist. Im Gegensatz zu Frameworks wie Echo oder JSF beschränkt sich nämlich WidgetServer nicht auf den Kanal "HTML", sondern kann mit seinen GUI-Plattformneutralität auch Swing-GUIs bedienen.&lt;br /&gt;&lt;br /&gt;Doch beginnen wir ganz von vorn.&lt;br /&gt;&lt;br /&gt;Bei meinem aktuellen Arbeitgeber besteht der Bedarf an der schnellen Entwicklung einer webbasierten Administrationsoberfläche für relativ komplexe geschäftslogische Prozesse. Die Konzepte dafür sind natürlich von der Fachseite schnell geschrieben, aber was meist das Hauptproblem darstellt, ist entweder fehlendes oder "zu kreatives" GUI-Design.&lt;br /&gt;&lt;br /&gt;Für beides bietet sich mit dem WidgetServer eine hervorragende Plattform für das Prototyping - durch die Definition der GUI in einem XML-Format lässt sich sehr schnell eine Oberfläche zaubern, die Änderungen an der XML-Datei on-the-fly umsetzt und daher wirklich "Rapid" Prototyping ermöglicht.&lt;br /&gt;WidgetServer selbst ist bereits ein stark gereiftes Framework - mittlerweile liegt die Version 1.6.1 vor und dementsprechend mächtig sind die vorhandenen GUI-Komponenten und ihre Funktionalität.&lt;br /&gt;&lt;br /&gt;Schon lange bevor der Begriff "AJAX" geprägt wurde, bot WidgetServer bereits für den HTML-Kanal das partielle Rendering an. Auch dies ist ein Grund für die sehr funktionalen Webanwendungen, die sich mit diesem Framework entwickeln lassen.&lt;br /&gt;&lt;br /&gt;Der größte Charme des Frameworks liegt aber meines Erachtens darin, dass die serverseitige Programmierung komplette Java-Entwicklung ist und rein gar nichts mit HTML oder HTTP zu tun hat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Ein Beispiel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ich brauche einen Button, also füge ich ein XML-Fragment in meine Anwendungsdefinition ein:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;button value="Tu was sinnvolles!" /&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;So ein Button hat natürlich irgendwie wenig Sinn ohne entsprechende Funktionalität dahinter. Also schreibe ich mir eine kleine Listener-Klasse, die ich per XML mit diesem Button assoziiere:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&amp;lt;button value="Tu was Sinnvolles!"&amp;gt;&lt;br /&gt;&amp;lt;srvlistener class="de.zanner.wiser.listener.DoButtonListener" /&amp;gt;&lt;br /&gt;&amp;lt;/button&amp;gt;&lt;/pre&gt;&lt;/blockquote&gt;Hier die Listener-Klasse:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;package de.zanner.wiser.listener;&lt;br /&gt;&lt;br /&gt;// add imports&lt;br /&gt;&lt;br /&gt;public class DoButtonListener implements IUnGuiEventListener {&lt;br /&gt;&lt;br /&gt;public void pcmf_execListener(UnComponent component) {&lt;br /&gt;   // TODO call business logic, modify component tree, ...&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;Wie man an diesem Beispiel bereits erkennt, ist das API etwas gewöhnungsbedürftig: es gibt natürlich keine "Un"-Komponente als undiszipliniertes Pendant einer Komponente ;o) .&lt;br /&gt;Jedes API-Element (Klasse, Interface oder Methode) besitzt einen Präfix, der mehr über den Typen des entsprechenden Artefakts aussagt.&lt;br /&gt;Im Fall der "UnComponent" steht das Präfix für "Unified" und bezeichnet damit eine ganze Reihe von Basisklassen, die gemeinsame Funktionalität sowohl für den Markup- (HTML-) als auch für den Swing-Kanal enthalten.&lt;br /&gt;Analog dazu gibt es noch Präfixe wie "Ke" für "Kernel" für noch allgemeinere Basiklassen ohne Bezug zur GUI oder die Präfixe "Mu" und "Ho" für die kanalspezifischen API-Klassen für die Kanäle "Markup" und "HalfObject".&lt;br /&gt;&lt;br /&gt;Am Präfix "Ho" für "HalfObject" erkennbar ist die Verwandschaft des Swing-Kanals zu Frameworks wie "ULC" - dem Ultra Light Client von Canoo oder Nexaweb. Über diesen Kanal kann ich aber wenig Auskunft erteilen, da ich mich momentan nur mit dem HTML-Kanal befasse.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Markup&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Hier also etwas mehr Infos über den Markup-Kanal, der üblicherweise für browserbasierte Webanwendungen verwendet wird.&lt;br /&gt;&lt;br /&gt;Einfluss auf das Aussehen der einzelnen Komponenten kann über Template-Dateien genommen werden, die von Renderer-Klassen dazu verwendet werden, die Komponente zusammenzubauen.&lt;br /&gt;Hier wird auch ersichtlich, warum der Kanal "Markup" und nicht etwa "HTML" heißt - es kann in dem Template natürlich beliebiger Markup-Code enthalten sein. Mit dem passenden Renderer dazu kann dann beispielsweise anstelle von HTML WML gerendert werden.&lt;br /&gt;Lieferbestandteil ist ein kompletter HTML-Kanal für den InternetExplorer und Gecko-basierte Browser (Mozilla).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Entwicklung neuer Komponenten&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Neue Komponenten können also recht einfach über ein eigenes Template und eine neue zugehörige Rendererklasse erstellt werden.&lt;br /&gt;Die Assoziation von Renderer und Template geschieht in einer XML-Konfigurationsdatei, so dass das Erstellen neuer Komponenten auch über die Abwandlung bestehender Templates und Verwendung des bestehenden Renderers möglich ist, z. B., um einen Tabellenkopf anders zu gestalten als in der Standardtabelle vom WidgetServer.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;Fazit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Der Fokus des WidgetServer liegt eindeutig auf Produktivität - ein ganz klarer Pluspunkt. Standards wie AJAX über XMLHTTPRequest findet man hier allerdings wenig.&lt;br /&gt;Einziger Berührungspunkt mit der Servlet API ist z. B. das Servlet zur Kommunikation zwischen JavaScript-Bibliothek und WidgetServer.&lt;br /&gt;&lt;br /&gt;Der Einstieg in die Entwicklung mit dem WidgetServer ist nicht ganz intuitiv.&lt;br /&gt;Es gibt z. B. (noch) kein XML-Schema für die XML-Datei, welche die Anwendung definiert.&lt;br /&gt;Etwas Abhilfe schafft hier der mit gelieferte GUI-Builder, der auch Doku zu den einzelnen Attributen liefert, aber leider dem aktuellen Release immer um 1 bis 2 Versionen hinterher läuft.&lt;br /&gt;&lt;br /&gt;Der Aufbau der API ist zwar in sich logisch - aber erst, wenn man die Logik einmal verstanden hat ;o)...&lt;br /&gt;Das aktuelle Geschäftsmodell der Firma &lt;a target="_blank" href="http://www.c1-setcon.de/widgetserver"&gt;C1 SetCon&lt;/a&gt;, für die der Entwickler des WidgetServer (Dirk von der Weiden) mittlerweile tätig ist, sieht daher ein "Startup Consulting" vor, das den Anwender in die Lage versetzen soll, selbst mit dem WidgetServer zu entwickeln.&lt;br /&gt;&lt;br /&gt;Für meine Begriffe sind die üblichen 10 Tage für bereits vorbelastete GUI-Entwickler etwas zu hoch gegriffen. Wer darüber hinaus noch Erfahrung in der Swing-Programmierung hat, findet sich wirklich schnell zurecht, wenn die größte Einstiegshürde "GUI-Definition in XML" überwunden ist.&lt;br /&gt;&lt;br /&gt;Für die Entwicklung von Anwendungen mit Kundenkontakt ist eine WidgetServer-Anwendung zu wenig an die Bedürnisse modernen Screen-Designs anpassbar. Für jedes neue Projekt ein neues Template-Kit zu schreiben ist mit Sicherheit zu aufwändig.&lt;br /&gt;Für interne Anwendungen, bei denen es keine Beschränkungen hinsichtlich JavaScript gibt und die dann meist auch den Anspruch an hohe Interaktivität und desktopanwendungsähnliches Look-and-Feel haben, ist diese Lösung einer klassischen Webentwicklung mit Struts oder JSF haushoch überlegen.&lt;br /&gt;&lt;br /&gt;Leider hat der WidgetServer etwas zu wenig sichtbare Community, was sicherlich einige potenzielle Anwender abschreckt. &lt;br /&gt;Das liegt wahrscheinlich daran, dass der Dirk von der Weiden in Consulting-Projekte eingebunden ist und daher wenig Zeit bleibt, eine Community zu pflegen. Das ist auch der Grund, warum die &lt;a target="_blank" href="http://sourceforge.net/projects/widgetserver"&gt;Sourceforge-&lt;/a&gt; und &lt;a target="_blank" href="http://wiser.dev.java.net"&gt;java.net&lt;/a&gt;-Seiten etwas vernachlässigt werden. &lt;br /&gt;C1 SetCon - speziell der Hauptentwickler Dirk von der Weiden - tut aber sehr viel dafür, die Wünsche und Bedürfnisse der Anwender umzusetzen und zu befriedigen.&lt;br /&gt;Ein weiterer WidgetServer-Entwickler - Thomas Boshell - hat ein eigenes (englischsprachiges) Blog mit einer Kategorie zum &lt;a target="_blank" href="http://www.jroller.com/page/tomboshell?catname=%2FWidgetServer"&gt;WidgetServer&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ich hoffe, dass durch mein Blog der WidgetServer etwas bekannter wird. Zumindest in Deutschland sollte er leicht Verbreitung finden, da die dahinter stehende Firma eine deutsche ist.&lt;br /&gt;An alle, die angesichts eines deutschen Software-Produkts die Nase rümpfen: ein gutes  Framework zur Webanwendungsentwicklung muss nicht aus den USA oder dem Ostblock kommen ;o) !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-8348836944840626318?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.c1-setcon.de/widgetserver/' title='WidgetServer'/><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/8348836944840626318/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=8348836944840626318' title='1 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/8348836944840626318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/8348836944840626318'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2007/06/widgetserver.html' title='WidgetServer'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-5505118436354526203</id><published>2007-06-01T09:39:00.001+02:00</published><updated>2007-06-15T08:12:56.785+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Review'/><category scheme='http://www.blogger.com/atom/ns#' term='Meinung'/><title type='text'>"Beyond Java" (Bruce A. Tate)</title><content type='html'>Ohne einen Anspruch auf ein fundiertes Literatur-Review hier mal mein erster Versuch einer Buchbesprechung. Ein Kollege, der im übrigen ziemlich fit in Java und Software-Architektur ist, hat mir obiges Buch ans Herz gelegt.&lt;br /&gt;&lt;br /&gt;Im großen und ganzen enthält es Meinungen verschiedener bekannter Java-Entwickler über den aktuellen Stand und die Zukunft von Java als Programmiersprache. Kurze Essenz: Java sei als Programmiersprache für die normale Webanwendungsentwicklung zu komplex geworden. Statt dessen sollte für den Standard Anwendungsentwicklungsfall "Webanwendung auf Datenbank" über Alternativen nachgedacht werden. Es geht also um die Betrachtung potenzieller Nachfolgekandidaten für Java - aber nur in diesem begrenzten Szenario.&lt;br /&gt;Dass dabei Ruby - insbesondere in Verbindung mit dem Webanwendungs-Framework Rails - nicht fehlen darf und sogar die Motivation zu diesem Buch darstellt, ist angesichts des aktuellen Hypes um diese in Japan enstandene Programmiersprache nicht verwunderlich.&lt;br /&gt;&lt;br /&gt;Ich war ja etwas skeptisch. Bei neuen Programmiersprachen sowieso. Wahrscheinlich nicht gerade die besten Voraussetzungen für meine persönliche Weiterentwicklung. Aber wenn mich etwas Neues überzeugt (bzw. jemand anderes von etwas Neuem überzeugt ;o) ), kann ich es auch sehr schnell umsetzen und weiter geben. Auch wenn ich schon einiges über Ruby gelesen habe, hat mich daher erst der Hinweis von meinem Kollegen dazu animiert, mich überhaupt erst mit Ruby zu befassen.&lt;br /&gt;&lt;br /&gt;Der Autor ist vorher bereits durch das Buch "Better, Faster, Lighter Java" in Erscheinung getreten und daher auch kein unbeschriebenes Blatt, was die Beurteilung von Java-Features angeht. Seine Meinung von Java ist stark geprägt von einer sehr großen Erfahrung im Consulting im Bereich Java-Anwendungsentwicklung. Ihm kann man in Sachen Java also keine mangelnde Fachkompetenz unterstellen.&lt;br /&gt;Außerdem dringt aus jeder Zeile eine große Leidenschaft für Java hervor - er versucht also nicht, Java schlecht zu machen, sondern zeigt ziemlich objektiv die Schwächen von Java im Bereich Anwendungsentwicklung auf.&lt;br /&gt;&lt;br /&gt;Als größte Schwäche kommt hier m. E. zum Tragen, dass der Fokus von Java und dem zugehörigen JCP sich immer mehr in Richtung serverseitige Programmierung verschoben hat. Die Produktivität im Bereich Anwendungsentwicklung hingegen ist durch die Komplexität der APIs und der Fülle an benötigten Frameworks aber immer weiter gesunken.&lt;br /&gt;&lt;br /&gt;Produktivität bei der Anwendungsentwicklung sei aber heute das Maß der Dinge im schnelllebigen Internet-Markt und Java hat hier seiner Meinung nach den Anschluss verloren.&lt;br /&gt;&lt;br /&gt;Aus den aufgestellten Schwächen der aktuellen Java 5 Version heraus abgeleitet stellt er eine Liste von Kriterien auf, die ein potenzieller Java-Nachfolger in diesem Bereich haben sollte. Dabei werden Konzepte wie Static/Dynamic Typing oder Strong/Weak Typing, Closures, Continuations usw. beleuchtet.&lt;br /&gt;Int3eressanteweise geht er gerade mit den Features von Java, die in die neue version Einzug gehalten haben, um Java für die Zukunft zu rüsten (Generics, Auto-boxing) ziemlich hart ins Gericht - was man aber letzten Endes durch seine immer sehr guten Begründungen relativ schnell nachvollziehen kann.&lt;br /&gt;&lt;br /&gt;Das ganze Buch ist gespickt mit Interviews mit aktuellen oder ehemaligen Java-Experten, über die man auch sehr viele Hintergrundinformationen zu Java und dem aktuellen Entwicklungsprozess sowohl in der Java- als auch speziell der Webanwendungsentwicklungs-Community erhält.&lt;br /&gt;&lt;br /&gt;Ich bin ja seit meinem Kontakt mit der JSF-Spezifikation sowieso ein wenig ein gebranntes Kind, was den Java Community Process angeht. Aus meiner Sicht entstehen hier überwiegend von der Software-Industrie getriebene Kompromisse auf Kosten der Bedürfnisse des Markts geschlossen.&lt;br /&gt;&lt;br /&gt;Das Buch ist also auch zur Erweiterung des eigenen Horizonts eine interessante Lektüre - mir hat sie an einigen Stellen die Augen geöffnet.&lt;br /&gt;Außerdem ist das Buch nicht sehr dick und liest sich daher an einigen Tagen durch. Bei mir stauben die sonst üblichen 400+ Seiten Wälzer immer ungelesen ein - dieses Buch habe ich von der ersten bis zur letzten Seite verschlungen!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-5505118436354526203?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/5505118436354526203/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=5505118436354526203' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/5505118436354526203'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/5505118436354526203'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2007/06/beyond-java-bruce-tate.html' title='&quot;Beyond Java&quot; (Bruce A. Tate)'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-7539935199829133608</id><published>2007-03-30T11:27:00.000+02:00</published><updated>2007-06-01T09:45:29.119+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Stolperstein'/><title type='text'>Eclipse WTP, JSF und JBoss</title><content type='html'>Heute mal ein klein wenig Ärger über Eclipse WTP. Offenbar verwendet das Web Tools Project von Eclipse den Projektnamen als Präfix für die jeweilige Deployment-Einheit, also bei einem Projektnamen von "JSF - Übung 01" würde beispielsweise das Web-Archiv "JSF - Übung 01.war" heißen. Dass damit nicht alle Application-Server klarkommen, kann man nicht nur vermuten...&lt;br /&gt;&lt;br /&gt;Nun ja - während eine Tomcat 5.0-Runtime keine Probleme damit hat, verschluckt sich sowohl Tomcat 5.5 als auch ein JBoss 4.0.5 (der ja auch nur einen Tomcat 5.5 unter der Haube hat)&lt;br /&gt;- das allerdings mit einer sehr "aussagekräftigen" Fehlermeldung:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;java.lang.NullPointerException&lt;br /&gt;   javax.faces.webapp.FacesServlet.init(FacesServlet.java:165)&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Der Code an der Stelle greift während der Servlet-Initialisierung auf die LifecycleFactory zu:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;lifecycle = lifecycleFactory.getLifecycle(lifecycleId);&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Auch nicht besonders hilfreich beim Finden des eigentlichen Fehlers.&lt;br /&gt;&lt;br /&gt;Nun ja - in &lt;a href="http://forum.java.sun.com/thread.jspa?forumID=427&amp;amp;threadID=5150950" target="_blank"&gt;diesem&lt;/a&gt; Thread im JSF-Forum von SUN fand ich einen Hinweis auf Spaces im Dateinamen und überprüfte diesen Verdacht.&lt;br /&gt;Siehe da - er bestätigte sich und nach Behebung dieses "Bugs" in meinem Projektnamen funktionierte es auch unter JBoss und Tomcat 5.5...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-7539935199829133608?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/7539935199829133608/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=7539935199829133608' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/7539935199829133608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/7539935199829133608'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2007/03/eclipse-wtp-jsf-und-jboss.html' title='Eclipse WTP, JSF und JBoss'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-4634304479175838810</id><published>2007-03-08T22:10:00.000+01:00</published><updated>2007-06-01T09:46:01.231+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Meinung'/><title type='text'>Java Exception Architektur</title><content type='html'>Nach dem Studium eines interessanten Artikels auf &lt;a href="http://dev2dev.bea.com/pub/a/2006/11/effective-exceptions.html" target="_blank"&gt;dev2dev&lt;/a&gt; habe ich mir nun meine eigene Meinung zum Exception Handling in Java-Anwendungen gebildet.&lt;br /&gt;Vielerorts wird ziemlich kontrovers über dieses Thema diskutiert und hier ist nun mein Beitrag dazu.&lt;br /&gt;&lt;br /&gt;Die grobe Unterteilung in Checked und Unchecked Exceptions lässt sich relativ gut auf die Schnittstellen und technischen Rahmenbedingungen innerhalb einer Java EE Anwendung abbilden.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Checked Exceptions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dieser Typ von Exceptions - also alle direkten Ableitungen von java.lang.Exception - sollte nur dann Verwendung finden, wenn sie zu der definierten Schnittstelle einer Methode gehören. In diesem Fall stellen sie ein erwartetes Fehlverhalten der betreffenden Methode dar, welches aus der Implementierung und den aktuellen Eingabeparametern der Methode resultiert.&lt;br /&gt;Diese Exceptions werden mittels throws an der Signatur der Methode spezifiziert und repräsentieren negative Ergebnisse der Methode, die vom Aufrufer behandelt werden MÜSSEN. Wichtig dabei ist also, dass der Aufrufer mit diesen negativen Ergebnissen der Methode auch umgehen KANN.&lt;br /&gt;Ein populäres Beispiel ist eine AccountOverdrawException einer Methode zum Abheben von einem Konto. Die Möglichkeit des Auftretens des Fehlers "Konto ist überzogen" wird hier bereits durch die Methodensignatur kommuniziert:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;public void withdraw(Account account, double amount) throws AccountOverdrawnException, ... {&lt;br /&gt;...&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;- these failures have to be handled by the caller - so there must be something the client can do to recover from this situation&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Unchecked Exceptions&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Unerwartete Fehlersituationen, die Situationen repräsentieren, die völlig unabhängig von der internen Implementierung bzw. den Eingabeparametern einer Methode sind, sollten als Unchecked Exceptions - also direkte Ableitungen von java.lang.RuntimeException - implementiert werden.&lt;br /&gt;Beispiele hierfür sind Fehler in der Software oder in der Ausführungsumgebung, z. B. Datenbankfehler.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Fazit&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Als Fazit kann man gut eine Richtlinie aus &lt;a href="http://java.sun.com/docs/books/tutorial/essential/exceptions/runtime.html" target="_blank"&gt;Sun's Exception Tutorial&lt;/a&gt; verwenden:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;If a client can reasonably be expected to recover from an exception, make it a checked exception.&lt;br /&gt;If a client cannot do anything to recover from the exception, make it an unchecked exception.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;Weitere Meinungen und Referenzen&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.octopull.demon.co.uk/java/ExceptionalJava.html" target="_blank"&gt;Alan Griffiths&lt;/a&gt; hat seine eigenen Erfahrungen, die sich wie folgt zusammenfassen lassen: Unchecked Exceptions sollten sparsam eingesetzt werden...&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mindview.net/Etc/Discussions/CheckedExceptions" target="_blank"&gt;Bruce Eckel&lt;/a&gt; ("Thinking in Java") steht auf dem Standpunkt: &lt;span style="font-weight: bold;"&gt;Checked Exceptions are not needed at all&lt;/span&gt; - auch eine interessante Diskussion!&lt;br /&gt;Sein Fazit: gar keine eigenen Checked Exceptions verwenden und alle Checked Exceptions des JDKs bzw. von Dritthersteller-Bibliotheken mit einem speziellen ExceptionAdapter wrappen, der sich von java.lang.RuntimeException ableitet.&lt;br /&gt;&lt;br /&gt;Dieser Standpunkt hat auch etwas für sich - als Beispiel sei hier die SQLException als Checked Exception der JDBC API zu nennen:&lt;br /&gt;Wenn der Datenzugriffscode z. B. sich zu etwas entwickelt, das KEINE Datenbank (sondern z. B. einen Web-Service) benutzt, besteht das Problem, die eigene Schnittstelle zur Persistenzschicht ändern zu müssen, wenn dort bisher die SQLException einfach nur propagiert wurde. Wenn diese Checked Exception in etwas Allgemeineres - oder gar eine Unchecked Exception umgewandelt würde, könnte die Anpassung der eigenen API vermieden werden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-4634304479175838810?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/4634304479175838810/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=4634304479175838810' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/4634304479175838810'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/4634304479175838810'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2007/01/java-exception-architektur.html' title='Java Exception Architektur'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-8547855903614273402</id><published>2007-03-08T21:11:00.000+01:00</published><updated>2007-06-01T09:43:53.355+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Allgemein'/><title type='text'>... und nun in Deutsch...</title><content type='html'>Damit mein Blog etwas produktiver wird, habe ich mich entschlossen, in meiner Muttersprache zu bloggen - ab sofort also in Deutsch...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-8547855903614273402?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/8547855903614273402/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=8547855903614273402' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/8547855903614273402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/8547855903614273402'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2007/03/und-nun-in-deutsch.html' title='... und nun in Deutsch...'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-115934554391370341</id><published>2006-09-27T12:00:00.000+02:00</published><updated>2007-06-01T09:41:31.580+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='HowTo'/><title type='text'>Usage of constant values in JSP code</title><content type='html'>As JSP developer I always have been disturbed by the lack of support for static constant values. With scriptlets or runtime expressions in &amp;lt;%= %&amp;gt; tags it's none of a problem - but who still uses this kind of coding style? In times of custom tags and the expression language provided by JSP/JSF you more and more refer to objects located in some scope of your application.&lt;br /&gt;&lt;br /&gt;Unfortunately the new expression language of JSP still does not support the use of static constant values - you still are forced to use hard-coded string literals throughout your JSPs.&lt;br /&gt;&lt;br /&gt;At the end of last year I was working on my first real JSF project and finally found a nifty solution for this kind of problem.&lt;br /&gt;&lt;br /&gt;I put all my application wide constants in a single "Constants" class. Then I used a ServletContextListener to put all it's public static fields via introspection in a Map in the application scope (not as JSF backing bean, but as ServletContext attribute) using the key "Constants".&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    public final class Constants {&lt;br /&gt;&lt;br /&gt;     /** ID for reference from the ServletContext. */&lt;br /&gt;     public static final String ID = "Constants";&lt;br /&gt;     &lt;br /&gt;     // other constants follow, e. g. for the example below:&lt;br /&gt;     public static final String TAB_DETAILS = "tabDetails";&lt;br /&gt;     ...&lt;br /&gt;     &lt;br /&gt;     /** "Cache" holding all public static fields by it's field name */&lt;br /&gt;     private static Map nameToValueMap = createNameToValueMap();&lt;br /&gt;     &lt;br /&gt;     /**&lt;br /&gt;      * Puts all public static fields via introspection into the resulting Map.&lt;br /&gt;      * Uses the name of the field as key to reference it's in the Map.&lt;br /&gt;      *&lt;br /&gt;      * @return a Map of field names to field values of&lt;br /&gt;      *         all public static fields of this class&lt;br /&gt;      */&lt;br /&gt;     private static Map createNameToValueMap() {&lt;br /&gt;         Map result = new HashMap();&lt;br /&gt;         Field[] publicFields = Constants.class.getFields();&lt;br /&gt;         for (int i = 0; i &amp;lt; publicFields.length; i++) {&lt;br /&gt;             Field field = publicFields[i];&lt;br /&gt;             String name = field.getName();&lt;br /&gt;             try {&lt;br /&gt;                 result.put(name, field.get(null));&lt;br /&gt;             } catch (Exception e) {&lt;br /&gt;                 System.err.println("Initialization of Constants class failed!");&lt;br /&gt;                 e.printStackTrace(System.err);&lt;br /&gt;             }&lt;br /&gt;         }&lt;br /&gt;         return result;&lt;br /&gt;     }&lt;br /&gt;     &lt;br /&gt;     /**&lt;br /&gt;      * Gets the Map of all public static fields.&lt;br /&gt;      * The field name is used as key for the value of the field itself.&lt;br /&gt;      *&lt;br /&gt;      * @return the Map of all public static fields&lt;br /&gt;      */&lt;br /&gt;     public static Map getNameToValueMap() {&lt;br /&gt;         return nameToValueMap;&lt;br /&gt;     }&lt;br /&gt;  }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;So, as already wrote, I put the Map into an application scoped attribute using a ServletContextListener:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;   ...&lt;br /&gt; public void contextInitialized(ServletContextEvent event) {&lt;br /&gt;     ServletContext sc = event.getServletContext();&lt;br /&gt;     sc.setAttribute(Constants.ID, Constants.getNameToValueMap());&lt;br /&gt; }&lt;br /&gt; ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This way I could access all my constants in the JSPs via JSP expression language:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    ...&lt;br /&gt;  &amp;lt;c:if test="${globalView.linieTab eq Constants.TAB_DETAILS}"&amp;gt;&lt;br /&gt;  ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Since the expression language allows you to reference mapped values via Map['key'] or Map.key, I could use the "dot" syntax to mimic a normal static access to the Constants classes fields.&lt;br /&gt;&lt;br /&gt;In JSFs expression language you additionally have to use the prefix "applicationScope.", since the normal VariableResolver implementations search for a managed bean by default - which my Map clearly isn't...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    &amp;lt;h:inputHidden value="#{applicationScope.Constants.TAB_DETAILS}"&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I hope this helps you achieve your goal of reusable constant values throughout your application.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-115934554391370341?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/115934554391370341/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=115934554391370341' title='2 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/115934554391370341'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/115934554391370341'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2006/09/usage-of-constant-values-in-jsp-code.html' title='Usage of constant values in JSP code'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-109057096206921637</id><published>2004-07-23T12:22:00.000+02:00</published><updated>2007-06-01T09:44:27.040+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Meinung'/><category scheme='http://www.blogger.com/atom/ns#' term='Opinion'/><title type='text'>OutOfMemoryError Warning System</title><content type='html'>One of my first experiences of the new JDK 1.5 came as a description of an OutOfMemoryError Warning System in the following newsletter:&lt;br /&gt;&lt;br /&gt;&lt;a target="_blank" href="http://www.javaspecialists.co.za/archive/Issue092.html"&gt;2004-07-20 The Java Specialists' Newsletter [Issue 092]&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Whom of us has never stepped into this pitfall of the Java VM when it comes to low memory? The most accepted and widely used counter measure is to increase the heap size in the JVM options - just change the -Xmx value and restart the JVM.&lt;br /&gt;&lt;br /&gt;But you always have to find the &lt;span style="font-style: italic;"&gt;right&lt;/span&gt; value. Otherwise you are trapped between low application performance because of a max heap value too high (the garbage collector just needs to much cpu time too clean up dead objects) and the diabolish OutOfMemoryError.&lt;br /&gt;&lt;br /&gt;In the newsletter above Dr. Kabutz describes a nifty (a new word of my vocabulary :o)) alternative: dynamic increasing of the heap size. Even if it's implemented with JDK 1.5 means, it shows how much more elaborated the JVM has become. To me it seems the guys at Sun are trying hard to improve the JVMs flaws in regard to performance and - especially here - memory management and consumption.&lt;br /&gt;&lt;br /&gt;The one thing I did not like with that solution is the "magical" downcast from the interface &lt;code&gt;java.lang.MemoryMXBean&lt;/code&gt; to the completely unrelated interface &lt;code&gt;java.lang.NotificationEmitter&lt;/code&gt;. This leaves me with a bad gut feeling, although it's described in the official Sun javadoc of the &lt;a target="_blank" href="http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/MemoryMXBean.html"&gt;MemoryMXBean&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();&lt;br /&gt;  NotificationEmitter emitter = (NotificationEmitter) mbean;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Although I'm not using the new JDK yet, I'm looking forward to it and for sure will come back to this tip when I need it!&lt;br /&gt;&lt;br /&gt;Cheers,&lt;br /&gt;&lt;br /&gt;René&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-109057096206921637?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/109057096206921637/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=109057096206921637' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/109057096206921637'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/109057096206921637'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2004/07/outofmemoryerror-warning-system.html' title='OutOfMemoryError Warning System'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7561090.post-108921180797379864</id><published>2004-07-07T19:48:00.000+02:00</published><updated>2007-06-01T09:44:06.695+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='General'/><category scheme='http://www.blogger.com/atom/ns#' term='Allgemein'/><title type='text'>Blog-Infected</title><content type='html'>OK. I'm infected by all those Java gurus. At least I created this blog. Let's see how (and if at all ;o)) it will proceed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7561090-108921180797379864?l=java_rzanner.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://java_rzanner.blogspot.com/feeds/108921180797379864/comments/default' title='Kommentare zum Post'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7561090&amp;postID=108921180797379864' title='0 Kommentare'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/108921180797379864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7561090/posts/default/108921180797379864'/><link rel='alternate' type='text/html' href='http://java_rzanner.blogspot.com/2004/07/blog-infected.html' title='Blog-Infected'/><author><name>René</name><uri>http://www.blogger.com/profile/05969229339885055498</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/-6jkZWXjSJJw/Tjr5S6QNt9I/AAAAAAAADPk/pvDz-OF9UZk/s220/IMG_4936.JPG'/></author><thr:total>0</thr:total></entry></feed>
